import * as THREE from 'three'

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'

// 加载gltf模型
export function utils_loadgltf(filePath: string, scene: THREE.Scene) {
  return new Promise((resolve, reject) => {
    const loader = new GLTFLoader()

    // 创建DRACOLoader实例并配置
    const dracoLoader = new DRACOLoader()
    // 设置Draco解码器路径，这里使用CDN路径
    dracoLoader.setDecoderPath('https://www.gstatic.com/draco/v1/decoders/')
    // 将DRACOLoader与GLTFLoader关联
    loader.setDRACOLoader(dracoLoader)

    loader.load(
      filePath,
      (gltf) => {
        console.log('模型加载成功:', gltf)

        // 检查模型是否有问题
        if (!gltf.scene) {
          console.error('模型不包含场景对象')
          return
        }

        // 可选：调整模型大小（根据实际模型大小调整）
        const box = new THREE.Box3().setFromObject(gltf.scene)
        const size = box.getSize(new THREE.Vector3())
        const center = box.getCenter(new THREE.Vector3())

        // console.log('模型尺寸:', size)
        // console.log('模型中心:', center)

        // 居中模型
        gltf.scene.position.x = -center.x
        gltf.scene.position.y = -center.y
        gltf.scene.position.z = -center.z

        // 设置模型透明度
        gltf.scene.traverse((child) => {
          if (child instanceof THREE.Mesh) {
            child.material.transparent = true
            child.material.opacity = 0.5
          }
        })

        // 将模型通过缩放，放大1000倍
        gltf.scene.scale.set(1000, 1000, 1000)

        // 添加到场景
        scene.add(gltf.scene)
        resolve(gltf.scene)
      },
      (xhr) => {
        // 加载进度
        // console.log((xhr.loaded / xhr.total) * 100 + '% 已加载')
      },
      (error) => {
        // 加载错误
        console.error('模型加载错误:', error)
        reject(error)
      }
    )
  })
}

// 修改模型加载逻辑，实现懒加载
export const loadedModels = {}
export const modelsToLoad = getModelsConfig()
// 从环境变量读取模型配置，如果环境变量不存在则使用默认配置
function getModelsConfig() {
  try {
    // 从环境变量获取配置
    if (import.meta.env.VITE_MODELS_CONFIG) {
      return JSON.parse(import.meta.env.VITE_MODELS_CONFIG)
    }
  } catch (error) {
    console.error('解析环境变量中的模型配置失败:', error)
  }

  // 提供默认配置作为后备
  return {
    侧围外板_右: './gltf模型/侧围外板_右.glb',
    侧围外板_左: './gltf模型/侧围外板_左.glb',
    前机舱分总成_左: './gltf模型/前机舱分总成_左.glb',
    前机舱分总成_右: './gltf模型/前机舱分总成_右.glb',
    前围板总成: './gltf模型/前围板总成.glb',
    后地板分总成: './gltf模型/后地板分总成.glb',
    后围总成: './gltf模型/后围总成.glb',
    顶盖外板总成: './gltf模型/顶盖外板总成.glb'
  }
}

// 模型懒加载函数
export async function lazyLoadModel(modelName: string, scene: THREE.Scene) {
  if (loadedModels[modelName]) {
    return loadedModels[modelName]
  }

  try {
    const model = await utils_loadgltf(modelsToLoad[modelName], scene)
    loadedModels[modelName] = model
    return model
  } catch (error) {
    console.error(`Failed to load model ${modelName}:`, error)
    return null
  }
}
